package com.myFirstSpringBootDemo.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

/**
 * spring boot 启动类
 * 启动时，只会在当前启动器的相同包或者子包下寻找@Controller @Service @Repository..注解，并将其实例化（不会向上查找）
 * 所以启动类应该放在根目录下src/main/java
 *
 * 启动类：项目的启动入口  必须加上@SpringBootApplication注解
 * 启动器：jar包的坐标
 *
 * @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
 * <p>
 *
 *
 * </p>
 * @Configuration 通过对<bean></bean>对象的操作，替代Spring中的xml 文件
 *
 * @SpringBootConfiguration
 * 				加上这个注解之后这个类就相当于是一个xml配置文件，
 * 					原来在xml中的<bean></bean>标签，在这里可以使用@bean来代替
 * 				有这个注解的类，在启动的时候扫描到之后会将这个类实例化，和<bean></bean>标签功能一致
 *
 *						@SpringBootConfiguration 注解是@Configuration注解的派生注解
 * 							和@Configuration的功能一致，标注这个类是一个配置类
 * 						只不过@SpringBootConfiguration是spring boot 的注解
 * 							@Configuration 是spring 的注解
 * 						这么做是为了解耦
 * <p>
 *
 * </p>
 * @EnableAutoConfiguration 尝试根据添加的jar依赖自动配置Spring 应用
 * @EnableAutoConfiguration = @AutoConfigurationPackage + @Import(AutoConfigurationImportSelector.class)
 * @AutoConfigurationPackage 自动注入主类所在包下所有的加了注解的类（@Controller,@Service，等），以及配置类@Configuration
 * 这也是为什么Spring boot 启动类必须放在根目录的原因
 * @AutoConfigurationPackage 上面的 @Import(AutoConfigurationPackages.Registrar.class) 注解中的类用于
 * 将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到spring的IOC容器中
 * <p></p>
 * @Import(AutoConfigurationImportSelector.class)
 * 1.直接导入普通的类（把一个类导入到另外一个类当中）
 * 2.导入实现了ImportSelector接口的类（AutoConfigurationImportSelector类实现了此接口）
 * 3.导入实现了ImportBeanDefinitionRegister接口的类
 * AutoConfigurationImportSelector.class 导入哪些组件的选择器
 * 它的这个方法用于，将所有需要导入的组件以全限定路径的方式返回，这些组件就会被添加到spring IOC 容器中。
 * 这些全限定路径是很多的自动配置类，就是给容器中导入这个场景需要的所有组件，并配置好这些组件
 * 在当前最新版本中，这个方法不一定调用
 * public String[] selectImports(AnnotationMetadata annotationMetadata);
 * 但是自动配置是通过这个方法
 * 	protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata);
 * <p>
 *
 *
 * </p>
 * @ComponentScan 相当于xml中的<context:component-scan></context:component-scan>标签
 * 					组件扫描，可自动发现和装配一些bean
 * <p>
 *
 *
 * </p>
 * @ConfigurationPropertiesScan(springBoot 2.2.0有)
 * 			扫描配置（实例化出来的对象的）属性
 */
@SpringBootApplication
@ImportResource(locations = {"classpath:/applicationContext-service.xml"})
public class DemoApplication {

	public static void main(String[] args) {

		SpringApplication.run(DemoApplication.class, args);
	}

}
